Note: This tutorial assumes you created your own urdf file or use one of the existing PR2 urdf files.. |
Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
Parse a urdf file
Description: This tutorial teaches you how to use the urdf parserTutorial Level: BEGINNER
Next Tutorial: Now that you know how to parse a urdf file, you can start using the KDL parser, or use the robot state publisher on your own robot
Contents
Reading a URDF file
This tutorial starts off where the previous one ended. You should still have your my_robot.urdf file with a description of the robot shown below.
Let's first create a package with a dependency on the urdf parser in our sandbox:
$ roscd $ cd sandbox $ roscreate-pkg testbot_description urdf $ roscd testbot_description $ rosmake
$ cd ~/catkin_ws/src $ catkin_create_pkg testbot_description urdf $ cd testbot_description
Now create a /urdf folder to store the urdf file we just created:
mkdir urdf
This follows the convention of always storing your robot's URDF file in a ROS package named MYROBOT_description and within a subfolder named /urdf. Other standard subfolders of your robot's description package include /meshes, /media and /cad, like so:
/MYROBOT_description package.xml CMakeLists.txt /urdf /meshes /materials /cad
Next, copy your my_robot.urdf file to the package and folder we just created:
$ cp /path/to/.../testbot_description/urdf/my_robot.urdf .
Create a folder src/ and fire up your editor to create a file called src/parser.cpp:
1 #include <urdf/model.h>
2 #include "ros/ros.h"
3
4 int main(int argc, char** argv){
5 ros::init(argc, argv, "my_parser");
6 if (argc != 2){
7 ROS_ERROR("Need a urdf file as argument");
8 return -1;
9 }
10 std::string urdf_file = argv[1];
11
12 urdf::Model model;
13 if (!model.initFile(urdf_file)){
14 ROS_ERROR("Failed to parse urdf file");
15 return -1;
16 }
17 ROS_INFO("Successfully parsed urdf file");
18 return 0;
19 }
The real action happens in lines 12-13: Error: No code_block found Here we create a parser object, and initialize it from a file by providing the filename. The initFile method returns true if the URDF file was parsed successfully.
Now let's try to run this code. First add the following line to your CMakeList.txt file:
rosbuild_add_executable(parser src/parser.cpp)
build your package, and run it.
$ make $ ./bin/parser my_robot.urdf
Now let's try to run this code. First add the following lines to your CMakeList.txt file:
add_executable(parser src/parser.cpp) target_link_libraries(parser ${catkin_LIBRARIES})
build your package, and run it.
$ catkin_make $ .<path>/parser <path>my_robot.urdf # ./devel/lib/testbot_description/parser ./src/testbot_description/urdf/my_robot.urdf (for example)
The output should look something like this:
[ INFO] 1254520129.560927000: Successfully parsed urdf file
Now take a look at the code API to see how to start using the URDF model you just created. A good example of the URDF model class in action is rviz's Robot::load.